package usbcali.edu.persistencia.control;

import usbcali.edu.dataaccess.dao.ReservasDAO;
import usbcali.edu.dataaccess.dao.SolEventosDAO;
import usbcali.edu.dataaccess.daoFactory.XMLHibernateDaoFactory;
import usbcali.edu.dataaccess.sessionFactory.HibernateSessionFactory;

import usbcali.edu.exceptions.*;

import usbcali.edu.persistencia.*;

import usbcali.edu.utilities.Utilities;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;



/**
 * interface ReservasLogic
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *
 */
public class ReservasLogic implements IReservasLogic {
    public List<Reservas> getReservas() throws Exception {
        List<Reservas> list = new ArrayList<Reservas>();

        try {
            list = XMLHibernateDaoFactory.getInstance().getReservasDAO()
                                         .findAll();
        } catch (Exception e) {
            throw new ZMessManager().new GettingException(ZMessManager.ALL +
                "Reservas");
        } finally {
        }

        return list;
    }

    public void saveReservas(String codReservas, Date fechaEvento,
            Date fechaReserva, String sfCodSala_Salaxtforma,
            String sfCodTforma_Salaxtforma, 
            String loggin_Usuarios,String numeroSolic,Long numeParti,String cuenta) throws Exception {
        Reservas entity = null;

        try {
        	  if (codReservas == null) {
                  throw new ZMessManager().new EmptyFieldException("codReservas");
              }

              if ((codReservas != null) &&
                      (Utilities.checkWordAndCheckWithlength(codReservas, 24) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "codReservas");
              }

              if (sfCodSala_Salaxtforma == null) {
                  throw new ZMessManager().new EmptyFieldException(
                      "sfCodSala_Salaxtforma");
              }

              if ((sfCodSala_Salaxtforma != null) &&
                      (Utilities.checkWordAndCheckWithlength(
                          sfCodSala_Salaxtforma, 24) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "sfCodSala_Salaxtforma");
              }

              if (sfCodTforma_Salaxtforma == null) {
                  throw new ZMessManager().new EmptyFieldException(
                      "sfCodTforma_Salaxtforma");
              }

              if ((sfCodTforma_Salaxtforma != null) &&
                      (Utilities.checkWordAndCheckWithlength(
                          sfCodTforma_Salaxtforma, 24) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "sfCodTforma_Salaxtforma");
              }

              if (numeroSolic == null) {
                  throw new ZMessManager().new EmptyFieldException(
                      "numero Solicitud");
              }

              if ((numeroSolic!= null) &&
                      (Utilities.checkWordAndCheckWithlength(
                          numeroSolic, 24) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "Numero Solicitud");
              }

              if (loggin_Usuarios == null) {
                  throw new ZMessManager().new EmptyFieldException(
                      "loggin_Usuarios");
              }

              if ((loggin_Usuarios != null) &&
                      (Utilities.checkWordAndCheckWithlength(loggin_Usuarios, 24) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "loggin_Usuarios");
              }
   
          /*    if ((tema != null) &&
                      (Utilities.checkWordAndCheckWithlength(tema, 64) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "Tema");
              }*/

              if ((numeParti != null) &&
                      (Utilities.checkWordAndCheckWithlength(numeParti.toString(), 64) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "Numero Participantes");
              }
              
             /* if ((descripci != null) &&
                      (Utilities.checkWordAndCheckWithlength(descripci, 64) == false)) {
                  throw new ZMessManager().new NotValidFormatException(
                      "Descripcion");
              }*/
              

         /*   if (codSala_Salaxtforma == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "codSala_Salaxtforma");
            }

            if ((codSala_Salaxtforma != null) &&
                    (Utilities.checkWordAndCheckWithlength(
                        codSala_Salaxtforma, 24) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "codSala_Salaxtforma");
            }

            if (codTforma_Salaxtforma == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "codTforma_Salaxtforma");
            }

            if ((codTforma_Salaxtforma != null) &&
                    (Utilities.checkWordAndCheckWithlength(
                        codTforma_Salaxtforma, 24) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "codTforma_Salaxtforma");
            }

            if (codSolicitude_SolEventos == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "codSolicitude_SolEventos");
            }

            if ((codSolicitude_SolEventos != null) &&
                    (Utilities.checkWordAndCheckWithlength(
                        codSolicitude_SolEventos, 24) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "codSolicitude_SolEventos");
            }*/

           

            ISalaxtformaLogic logicSalaxtforma1 = new SalaxtformaLogic();
            ISolEventosLogic logicSolEventos2 = new SolEventosLogic();
            IUsuariosLogic logicUsuarios3 = new UsuariosLogic();
            SalaxtformaId salaxtformaIdClass = new SalaxtformaId();
            Salaxtforma   salaxforma=new Salaxtforma();
            
            salaxtformaIdClass.setCodSala(sfCodSala_Salaxtforma);
            salaxtformaIdClass.setCodTforma(sfCodTforma_Salaxtforma);
            
            
        //   salaxforma.setCapacidad(numeParti);
       //    salaxforma.setId(salaxtformaIdClass);
             
        //    Salas salas=new Salas();
       //     salas.setCodSala(sfCodSala_Salaxtforma);
             
          //  salaxforma.setSalas(salas);
             
           //  TForSalas tFormas=new TForSalas();
          //   tFormas.setCodTforma(sfCodTforma_Salaxtforma);
           //  salaxforma.setTForSalas(tFormas);
            
         Salaxtforma salaxtformaClass = logicSalaxtforma1.getSalaxtforma(salaxtformaIdClass);
            SolEventos solEventosClass = logicSolEventos2.getSolEventos(numeroSolic);
            Usuarios usuariosClass = logicUsuarios3.getUsuarios(loggin_Usuarios);

        /*   if (salaxtformaClass == null) {
                throw new ZMessManager().new ForeignException("salaxtforma");
           }
*/
        /*    if (solEventosClass == null) {
                throw new ZMessManager().new ForeignException("solEventos");
            }

            if (usuariosClass == null) {
                throw new ZMessManager().new ForeignException("usuarios");
            }*/

            entity = getReservas(codReservas);

          /*  if (entity != null) {
                throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
            }*/

            entity = new Reservas();
            entity.setCodReservas(codReservas);
            entity.setFechaEvento(fechaEvento);
            entity.setFechaReserva(fechaReserva);
            entity.setSalaxtforma(salaxtformaClass);
           entity.setSolEventos(solEventosClass);
            entity.setUsuarios(usuariosClass);
            entity.setRCuenta(cuenta);
            entity.setRNumparticipantes(numeParti.toString());
           
           
            HibernateSessionFactory.beginTransaction();
            XMLHibernateDaoFactory.getInstance().getReservasDAO().save(entity);
            HibernateSessionFactory.commit();
        } catch (Exception e) {
            HibernateSessionFactory.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }

    public void deleteReservas(String codReservas) throws Exception {
        Reservas entity = null;

        if (codReservas == null) {
            throw new ZMessManager().new EmptyFieldException("codReservas");
        }

        List<ElemAudiovisuales> elemAudiovisualeses = null;
        List<HorarioRxsala> horarioRxsalas = null;
        List<SoliAliAsisExternos> soliAliAsisExternoses = null;
        entity = getReservas(codReservas);

        if (entity == null) {
            throw new ZMessManager().new EmptyFieldException("Reservas");
        }

        try {
            elemAudiovisualeses = XMLHibernateDaoFactory.getInstance()
                                                        .getElemAudiovisualesDAO()
                                                        .findByProperty("reservas.codReservas",
                    codReservas);

            if (Utilities.validationsList(elemAudiovisualeses) == true) {
                throw new ZMessManager().new DeletingException(
                    "elemAudiovisualeses");
            }

            horarioRxsalas = XMLHibernateDaoFactory.getInstance()
                                                   .getHorarioRxsalaDAO()
                                                   .findByProperty("reservas.codReservas",
                    codReservas);

            if (Utilities.validationsList(horarioRxsalas) == true) {
                throw new ZMessManager().new DeletingException("horarioRxsalas");
            }

            soliAliAsisExternoses = XMLHibernateDaoFactory.getInstance()
                                                          .getSoliAliAsisExternosDAO()
                                                          .findByProperty("reservas.codReservas",
                    codReservas);

            if (Utilities.validationsList(soliAliAsisExternoses) == true) {
                throw new ZMessManager().new DeletingException(
                    "soliAliAsisExternoses");
            }

            HibernateSessionFactory.beginTransaction();
            XMLHibernateDaoFactory.getInstance().getReservasDAO().delete(entity);
            HibernateSessionFactory.commit();
        } catch (Exception e) {
            HibernateSessionFactory.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }

    public void updateReservas(String codReservas, Date fechaEvento,
            Date fechaReserva, String sfCodSala_Salaxtforma,
            String sfCodTforma_Salaxtforma, 
            String loggin_Usuarios,String numeroSolic,Long numeParti,String cuenta) throws Exception {
        Reservas entity = null;

        try {
        	 if (codReservas == null) {
                 throw new ZMessManager().new EmptyFieldException("codReservas");
             }

             if ((codReservas != null) &&
                     (Utilities.checkWordAndCheckWithlength(codReservas, 24) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "codReservas");
             }

             if (sfCodSala_Salaxtforma == null) {
                 throw new ZMessManager().new EmptyFieldException(
                     "sfCodSala_Salaxtforma");
             }

             if ((sfCodSala_Salaxtforma != null) &&
                     (Utilities.checkWordAndCheckWithlength(
                         sfCodSala_Salaxtforma, 24) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "sfCodSala_Salaxtforma");
             }

             if (sfCodTforma_Salaxtforma == null) {
                 throw new ZMessManager().new EmptyFieldException(
                     "sfCodTforma_Salaxtforma");
             }

             if ((sfCodTforma_Salaxtforma != null) &&
                     (Utilities.checkWordAndCheckWithlength(
                         sfCodTforma_Salaxtforma, 24) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "sfCodTforma_Salaxtforma");
             }

             if (numeroSolic == null) {
                 throw new ZMessManager().new EmptyFieldException(
                     "numero Solicitud");
             }

             if ((numeroSolic!= null) &&
                     (Utilities.checkWordAndCheckWithlength(
                         numeroSolic, 24) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "Numero Solicitud");
             }

             if (loggin_Usuarios == null) {
                 throw new ZMessManager().new EmptyFieldException(
                     "loggin_Usuarios");
             }

             if ((loggin_Usuarios != null) &&
                     (Utilities.checkWordAndCheckWithlength(loggin_Usuarios, 24) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "loggin_Usuarios");
             }
  
        

             if ((numeParti != null) &&
                     (Utilities.checkWordAndCheckWithlength(numeParti.toString(), 64) == false)) {
                 throw new ZMessManager().new NotValidFormatException(
                     "Numero Participantes");
             }
             
          

       
          

           ISalaxtformaLogic logicSalaxtforma1 = new SalaxtformaLogic();
           ISolEventosLogic logicSolEventos2 = new SolEventosLogic();
           IUsuariosLogic logicUsuarios3 = new UsuariosLogic();
           SalaxtformaId salaxtformaIdClass = new SalaxtformaId();
           Salaxtforma   salaxforma=new Salaxtforma();
           
           salaxtformaIdClass.setCodSala(sfCodSala_Salaxtforma);
           salaxtformaIdClass.setCodTforma(sfCodTforma_Salaxtforma);
           
      
           
        Salaxtforma salaxtformaClass = logicSalaxtforma1.getSalaxtforma(salaxtformaIdClass);
           SolEventos solEventosClass = logicSolEventos2.getSolEventos(numeroSolic);
           Usuarios usuariosClass = logicUsuarios3.getUsuarios(loggin_Usuarios);

     

          entity = getReservas(codReservas);


         //  entity = new Reservas();
          entity.setCodReservas(codReservas);
           entity.setFechaEvento(fechaEvento);
           entity.setFechaReserva(fechaReserva);
           entity.setSalaxtforma(salaxtformaClass);
          entity.setSolEventos(solEventosClass);
           entity.setUsuarios(usuariosClass);
           entity.setRCuenta(cuenta);
           entity.setRNumparticipantes(numeParti.toString());
          
            HibernateSessionFactory.beginTransaction();
            XMLHibernateDaoFactory.getInstance().getReservasDAO().update(entity);
            HibernateSessionFactory.commit();
        } catch (Exception e) {
            HibernateSessionFactory.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }

    public Reservas getReservas(String codReservas) throws Exception {
        Reservas entity = null;

        try {
            entity = XMLHibernateDaoFactory.getInstance().getReservasDAO()
                                           .findById(codReservas);
        } catch (Exception e) {
            throw new ZMessManager().new FindingException("Reservas");
        } finally {
        }

        return entity;
    }

    public List<Reservas> findPageReservas(String sortColumnName,
        boolean sortAscending, int startRow, int maxResults)
        throws Exception {
        List<Reservas> entity = null;

        try {
            entity = XMLHibernateDaoFactory.getInstance().getReservasDAO()
                                           .findPageReservas(sortColumnName,
                    sortAscending, startRow, maxResults);
        } catch (Exception e) {
            throw new ZMessManager().new FindingException("Reservas");
        } finally {
        }

        return entity;
    }

    public Long findTotalNumberReservas() throws Exception {
        Long entity = null;

        try {
            entity = XMLHibernateDaoFactory.getInstance().getReservasDAO()
                                           .findTotalNumberReservas();
        } catch (Exception e) {
            throw new ZMessManager().new FindingException("Reservas Count");
        } finally {
        }

        return entity;
    }

 public Long consultaSecuenciaReserva() throws Exception{
    	
    	ReservasDAO dao=new ReservasDAO();
    Long consulta=dao.consultarSecuenciaReserva();
    	
    	return consulta;
    }
    
    
    /**
    *
    * @param varibles
    *            este arreglo debera tener:
    *
    * [0] = String variable = (String) varibles[i]; representa como se llama la
    * variable en el pojo
    *
    * [1] = Boolean booVariable = (Boolean) varibles[i + 1]; representa si el
    * valor necesita o no ''(comillas simples)usado para campos de tipo string
    *
    * [2] = Object value = varibles[i + 2]; representa el valor que se va a
    * buscar en la BD
    *
    * [3] = String comparator = (String) varibles[i + 3]; representa que tipo
    * de busqueda voy a hacer.., ejemplo: where nombre=william o where nombre<>william,
        * en este campo iria el tipo de comparador que quiero si es = o <>
            *
            * Se itera de 4 en 4..., entonces 4 registros del arreglo representan 1
            * busqueda en un campo, si se ponen mas pues el continuara buscando en lo
            * que se le ingresen en los otros 4
            *
            *
            * @param variablesBetween
            *
            * la diferencia son estas dos posiciones
            *
            * [0] = String variable = (String) varibles[j]; la variable ne la BD que va
            * a ser buscada en un rango
            *
            * [1] = Object value = varibles[j + 1]; valor 1 para buscar en un rango
            *
            * [2] = Object value2 = varibles[j + 2]; valor 2 para buscar en un rango
            * ejempolo: a > 1 and a < 5 --> 1 seria value y 5 seria value2
                *
                * [3] = String comparator1 = (String) varibles[j + 3]; comparador 1
                * ejemplo: a comparator1 1 and a < 5
                    *
                    * [4] = String comparator2 = (String) varibles[j + 4]; comparador 2
                    * ejemplo: a comparador1>1  and a comparador2<5  (el original: a > 1 and a <
                            * 5) *
                            * @param variablesBetweenDates(en
                            *            este caso solo para mysql)
                            *  [0] = String variable = (String) varibles[k]; el nombre de la variable que hace referencia a
                            *            una fecha
                            *
                            * [1] = Object object1 = varibles[k + 2]; fecha 1 a comparar(deben ser
                            * dates)
                            *
                            * [2] = Object object2 = varibles[k + 3]; fecha 2 a comparar(deben ser
                            * dates)
                            *
                            * esto hace un between entre las dos fechas.
                            *
                            * @return lista con los objetos que se necesiten
                            * @throws Exception
                            */
    public List<Reservas> findByCriteria(Object[] variables,
        Object[] variablesBetween, Object[] variablesBetweenDates)
        throws Exception {
        List<Reservas> list = new ArrayList<Reservas>();
        String where = new String();
        String tempWhere = new String();

        if (variables != null) {
            for (int i = 0; i < variables.length; i++) {
                if ((variables[i] != null) && (variables[i + 1] != null) &&
                        (variables[i + 2] != null) &&
                        (variables[i + 3] != null)) {
                    String variable = (String) variables[i];
                    Boolean booVariable = (Boolean) variables[i + 1];
                    Object value = variables[i + 2];
                    String comparator = (String) variables[i + 3];

                    if (booVariable.booleanValue()) {
                        tempWhere = (tempWhere.length() == 0)
                            ? ("(model." + variable + " " + comparator + " \'" +
                            value + "\' )")
                            : (tempWhere + " AND (model." + variable + " " +
                            comparator + " \'" + value + "\' )");
                    } else {
                        tempWhere = (tempWhere.length() == 0)
                            ? ("(model." + variable + " " + comparator + " " +
                            value + " )")
                            : (tempWhere + " AND (model." + variable + " " +
                            comparator + " " + value + " )");
                    }
                }

                i = i + 3;
            }
        }

        if (variablesBetween != null) {
            for (int j = 0; j < variablesBetween.length; j++) {
                if ((variablesBetween[j] != null) &&
                        (variablesBetween[j + 1] != null) &&
                        (variablesBetween[j + 2] != null) &&
                        (variablesBetween[j + 3] != null) &&
                        (variablesBetween[j + 4] != null)) {
                    String variable = (String) variablesBetween[j];
                    Object value = variablesBetween[j + 1];
                    Object value2 = variablesBetween[j + 2];
                    String comparator1 = (String) variablesBetween[j + 3];
                    String comparator2 = (String) variablesBetween[j + 4];
                    tempWhere = (tempWhere.length() == 0)
                        ? ("(" + value + " " + comparator1 + " " + variable +
                        " and " + variable + " " + comparator2 + " " + value2 +
                        " )")
                        : (tempWhere + " AND (" + value + " " + comparator1 +
                        " " + variable + " and " + variable + " " +
                        comparator2 + " " + value2 + " )");
                }

                j = j + 4;
            }
        }

        if (variablesBetweenDates != null) {
            for (int k = 0; k < variablesBetweenDates.length; k++) {
                if ((variablesBetweenDates[k] != null) &&
                        (variablesBetweenDates[k + 1] != null) &&
                        (variablesBetweenDates[k + 2] != null)) {
                    String variable = (String) variablesBetweenDates[k];
                    Object object1 = variablesBetweenDates[k + 1];
                    Object object2 = variablesBetweenDates[k + 2];
                    String value = null;
                    String value2 = null;

                    try {
                        Date date1 = (Date) object1;
                        Date date2 = (Date) object2;
                        value = Utilities.formatDateWithoutTimeInAStringForBetweenWhere(date1);
                        value2 = Utilities.formatDateWithoutTimeInAStringForBetweenWhere(date2);
                    } catch (Exception e) {
                        list = null;
                        throw e;
                    }

                    tempWhere = (tempWhere.length() == 0)
                        ? ("(model." + variable + " between \'" + value +
                        "\' and \'" + value2 + "\')")
                        : (tempWhere + " AND (model." + variable +
                        " between \'" + value + "\' and \'" + value2 + "\')");
                }

                k = k + 2;
            }
        }

        if (tempWhere.length() == 0) {
            where = null;
        } else {
            where = "(" + tempWhere + ")";
        }

        try {
            list = XMLHibernateDaoFactory.getInstance().getReservasDAO()
                                         .findByCriteria(where);
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        } finally {
        }

        return list;
    }
}
